home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 March
/
EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso
/
docs
/
corsoguide
/
rinfresco-17.txt
< prev
next >
Wrap
Text File
|
1996-02-22
|
5KB
|
94 lines
Il Rinfresco delle finestre
Come voi tutti sapete le finestre possono essere spostate, ingrandite,
rimpicciolite, fatte scivolare una davanti all'altra ecc.; il sistema di
Amiga è progettato in maniera così flessibile che tutto ciò è gestito in
maniera trasparente all'applicazione; vale a dire che l'applicazione disegna
all'interno della finestra sempre nella stessa maniera e con le stesse
cordinate, indipendentemente dalla posizione o grandezza di quest'ultima; un
problemma tuttavia permane: cosa succede quando una zona oscurata da
un'altra finestra viene riportata alla luce? In tal caso il sistema informa
l'applicazione, mediante un messaggio IDCMP_REFRESHWINDOW alla porta IDCMP
della finestra; l'applicazione una volta ricevuto questo messaggio, deve
effettuare una chiamate BeginRefresh(), procedere con i dovuti rinfreschi al
contenuto della finestra e chiamare EndRefresh(); nel caso non si debba
effettuare alcun rinfresco, bisogna comunque chiamare la coppia delle
funzioni appena viste senza alcuna istruzione al loro interno; sintassi di
queste due funzioni è:
BeginRefresh(finestra);
dove "finestra" è il puntatore alla finestra di cui effettuare il rinfresco;
EndRefresh(finestra,finito);
"finestra" è la stessa della BeginRefresh corrispondente, "finito" è una
variabile booleana e vale TRUE se il rinfresco è stato ultimato; FALSE se il
rinfresco non è finito, allora il sistema mantiene bloccato il layer della
finestra fino a quando non si esegue una coppia BeginRefresh/EndRefresh con
"finito" impostato a TRUE; vi chiederete perchè spezzettare l'operazione di
rinfresco in diversi blocchi: durante il rinfresco il sistema attende, per
cui è IMPORTANTE che il codice del blocco di rinfresco sai molto veloce;
spezzettando l'operazione di rinfresco in più sezioni, è agevole ripassare
il controllo al sistema senza bloccarlo per un tempo esagerato.
Se non desiderate effettuare alcun rinfresco e quindi chiamare le due
istruzioni appena indicate, oppure volete far realizzare il rinfresco
totalmente al sistema, potete impostare il flag WA_NoCareRefresh.
Esistono tre tipi differenti di rinfresco organizzati dal sistema, ognuno
con livello di efficienza e anche di consumo crescente:
Simple refresh
Simple refresh è il rinfresco più semplice: vengono mantenuti e rinfrescati
tutti quei pixels che sono visualizzati sullo schermo; ad esempio, se una
finestra viene spostata, il suo contenuto viene ricopiato; i problemi si
verificano quando un'altra finestra passa davanti a quella "rinfrescata" in
quanto il suo contenuto viene oscurato, per cui se la finestra viene
spostata o riportata in avanti, la zona oscurata non viene rinfrescata.
Questo tipo di rinfresco si attiva impostando WFLG_SIMPLE_REFRESH nel tag
WA_Flags.
Smart refresh
Nella finestra Smart refresh il sistema mantiene e rinfresca tutto il
contenuto della finestra; nel caso visto prima, anche se la finestra con
questo tipo di rinfresco viene oscurata, quando viene riportata alla luce
la zona prima non visibile, viene correttamente ridisegnata; questo
rinfresco si attiva impostando WFLG_SMART_REFRESH nel tag WA_Flags.
SuperBitMap refresh
Nelle finestre SuperBitMap l'utente specifica il BitMap (struttura che
contiene le informazione per un'immagine o uno spazio grafico) che il
sistema utilizzerà per il rinfresco della finestra; questo tipo di finestra
serve quando quest'ultima può essere più piccola dell'immagine (nel qual
caso la finestra mostra solo una porzione dell'immagine); ad esempio se si
utilizza una finestra ridimensionabile, si disegna qualcosa e la si riduce,
quando si riallarga la zona dell'immagine oscurata dal rimpicciolimento
della finestra viene rinfrescata; naturalmente questo tipo di finestra si
propone anche per altri utilizzi, quali ad esempio lo scorrimento di
un'immagine più grande nella stessa, come fa MultiView; normalmente una
finestra SuperBitMap è anche GimmeZeroZero, in modo da avere due layer
differenti, uno per il contenuto e uno per il bordo; questo tipo di finestra
si imposta con WFLG_SUPER_BITMAP in WA_Flags.
Mentre per i primi due rinfreschi serve semplicemente impostare il flag
indicato ed il resto sarà compito del sistema, nella finestra SuperBitMap
occorre allocare ed inizializzare una struttura BitMap nostra e passarla al
tag WA_SuperBitMap all'apertura della finestra; per inizializzare una BitMap
occorre allocare una struttura BitMap, inizializzarne i campi con la
funzione:
InitBitMap(bitmap,profondità,ampiezza,altezza);
dove "bitmap" è il puntatore alla struttura BitMap da inizializzare,
"profondità", "ampiezza" e "altezza" sono LONG indicanti la dimensione della
bitmap; una volta inizializzata la bitmap, occorre allocare la memoria che
contiene i piani dei bit dell'immagine mediante la funzione:
puntpiano = AllocRaster(ampiezza,altezza);
bisogna chiamare questa funzione per ogni bitplane da allocare, il cui
puntatore è restituito in "puntpiano" che è di tipo PLANEPTR; questi
puntatori dovranno essere inseriti nel campo vettore Planes della struttura
BitMap; all'uscita del programma bisogna deallocare i bitplanes con
FreeRaster(puntpiano,ampiezza,altezza);